package day240123

import (
	"fmt"
	"strconv"
)

func Make切片长度和容量和Append() {

	//go语言中，可以使用make函数创建slice  map  channel interface
	//make 语法：    make(类型, 初始长度, 初始容量)
	//				初始容量可以省略，默认和长度相等

	////省略初始容量
	var slice []string                  // 这种方法声明，是nil
	fmt.Println(slice)                  // [] 是nil
	fmt.Println(slice == nil)           // true
	fmt.Printf("无内存空间 %p\n", slice)     //没内存空间
	fmt.Println(len(slice), cap(slice)) //长度和容量 都是 0

	s1 := make([]int, 0)          //make 方法创建slice切片
	fmt.Println(s1)               //[] 但不是nil
	fmt.Println(s1 == nil)        //false
	fmt.Printf("有内存空间 %p\n", s1)  //有内存空间
	fmt.Println(len(s1), cap(s1)) //长度和容量 都是 0

	//有初始容量
	//s1 := make([]int, 0, 3)
	//fmt.Println(len(s1), cap(s1)) //0   3

	//append 【append的英文翻译：附加】
	s := make([]string, 0)
	fmt.Println(len(s), cap(s)) // 0  0
	s = append(s, "a")
	fmt.Println("append从s加入a之后", s)
	fmt.Println(len(s), cap(s)) // 1  1

	s = append(s, "b")
	fmt.Println(s)
	fmt.Println(len(s), cap(s)) // 2  2	//这里的容量1 变 2

	s = append(s, "c")
	fmt.Println(s)
	fmt.Println(len(s), cap(s)) // 3  4	容量从2 变 4

	s = append(s, "4", "5", "6", "7", "8", "9")
	fmt.Println(s)
	fmt.Println(len(s), cap(s)) // 9  10	//这容量不一定翻倍
	//总结： 当追加的元素超出原有容量时，Go会自动分配更多的内存空间，以容纳新增的元素。

	//切片加入切片
	fmt.Println("切片加入切片")
	s2 := make([]int, 0)
	s3 := []int{1, 2, 3, 4}
	s2 = append(s2, s3...) // 切片append切片 一定要...

	fmt.Println(s2, s3)
	fmt.Println(len(s2), cap(s2))

	//s2 = append(s2, s...) s2都是int  s 是string

	for i, str := range s {
		num, err := strconv.Atoi(str) //Atoi 把字符串转换成int类型
		if err == nil {
			s2 = append(s2, num)
			fmt.Printf("转换s类型 %T", s) //输出s类型
			fmt.Println("----", i)
		} else {
			fmt.Println("转换失败:", err)
		}
	}
	fmt.Print(s2)

	// 转换失败: strconv.Atoi: parsing "a": invalid syntax
	// 转换失败: strconv.Atoi: parsing "b": invalid syntax
	// 转换失败: strconv.Atoi: parsing "c": invalid syntax
	// 转换s类型 []string---- 3
	// 转换s类型 []string---- 4
	// 转换s类型 []string---- 5
	// 转换s类型 []string---- 6
	// 转换s类型 []string---- 7
	// 转换s类型 []string---- 8
	// [1 2 3 4 4 5 6 7 8 9]
}
